/**
 * 网络请求封装
 * @author big.A
 * @version 1.2.0
 **/

const tool = require('@/xiong/tool.js');

module.exports = {
	// 基础配置
	config: {
		host: "https://cang.fxjk.vip/api/", // 正式服
		// host: "https://cang.test.fxjk.vip/api/", // 测试服
		// host: "http://www.cangdao.test/api/", // 本地
		data: {},
		method: "GET",
		dataType: "json",
		responseType: "text",
		// ==== 延迟loadding ====
		loading: true,
		loadingText: '请求中',
		loadingTime: 800, // 在此时间内，请求还没回来的话，就显示加载中动画，单位ms
		timer: null, // 定时器
	},

	// 核心请求
	request(url, method, data) {
		// 组织数据
		let options      = {};
		options.data 	 = data || {};
		options.url      = this.config.host + url;
		options.dataType = this.config.dataType;
		options.method 	 = method || this.config.method;
		options.header 	 = {
			'Content-Type': 'application/x-www-form-urlencoded',
			'Api-Type': tool.client(),
			'Api-Token': uni.getStorageSync('token'),
		};
		
		// 是否直接显示loading，在data参数中增加{loading:true}，则直接显示
		// 否则根据请求时间显示loading
		options.loading =  typeof(data) == 'object' && data.loading == true ? true : false;

		// Promise
		return new Promise((resolve, reject) => {
			let _config = null
			// 请求结果处理
			options.complete = (response) => {
				response.config = _config
				
				// ==== loadding相关 ====
				// 清空延迟loadding
				uni.hideLoading();
				clearTimeout(this.config.timer);
				this.config.timer = null;
				// 关闭下拉刷新动画
				uni.stopPullDownRefresh();
				
				// ==== 请求结果处理 ====
				// HTTP错误
				if (response.statusCode !== 200) {
					this._http_error(response.statusCode);
					reject(response)
				}else { 
					// HTTP成功抛出resolve
					if (response.data.code == 1) {
						resolve(response.data.data)
					}
					// 接口错误抛出reject
					if (response.data.code !== 1 && response.data.code <= 100) {
						reject(response.data)
					}
					// 是否显示接口提示,如无需显示后端info传fasle
					if (response.data.info && response.data.info !== '') {
						tool.msg(response.data.info);
					}
					// 接口特殊错误处理 大于2000为接口权限错误
					if (response.data.code > 2000) {
						try {
							uni.removeStorageSync('token');
							tool.go('/pages/in/login', 'reLaunch',1300);
						} catch (e) {
							tool.msg('TOKEN清理异常');
						}
					}
				}
			}
			
			// 合并参数
			_config = Object.assign({}, this.config, options)
			
			// 是否显示loading
			// 加一个是否已有timer定时器的判断
			if (_config.loading == false && !this.config.timer) {
				this.config.timer = setTimeout(() => {
					uni.showLoading({
						title: this.config.loadingText
					})
					this.config.timer = null;
				}, this.config.loadingTime);
			} else {
				uni.showLoading({
					title: this.config.loadingText
				})
			}
			// 发起请求
			uni.request(_config);
		});
	},

	
	// POST请求
	post(url, data, callback, err_callback) {
		return this.request(url, 'POST', data).then((result) => {
			if (callback) {callback(result)}
		}).catch((result) => {
			if (err_callback) {err_callback(result)}
		});
	},

	// GET请求
	get(url, data, callback, err_callback) {
		return this.request(url, 'POST', data).then((result) => {
			if (callback) {callback(result)}
		}).catch((result) => {
			if (err_callback) {err_callback(result)}
		});
	},


	// HTTP错误处理
	_http_error(err) {
		switch (err) {
			case 401:
				console.error("请求被拒绝")
				break;
			case 404:
				console.error("接口不存在")
				break;
			case 405:
				console.error("错误的请求")
				break;
			case 500:
				console.error("服务器500错误")
				break;
			default:
				console.error("服务器错误")
				break;
		}
	},

}
